package cn.edu.wynu.d14_extends_constructor;
/*
子类构造器的特点:
子类的全部构造器，都会先调用父类的构造器，再执行自己。
子类构造器是如何实现调用父类构造器的:
1、默认情况下，子类全部构造器的第一行代码都是 super()(写不写都有)，它会调用父类的无参数构造器
2、如果父类没有无参数构造器，则我们必须在子类构造器的第一行手写super(...)，指定去调用父类的有参数构造器。
*/
class F{
    // 无参构造器
//    public F (){
//        System.out.println("父类F的无参构造器执行了");
//    }

    // 要删除上面这个无参构造器，就在下面创建一个有参构造器，但这会报错，这时就必须手写super
    public F(String name,int age){
        System.out.println("父类F的有参构造器执行了");
    }
}

class Z extends F{
    public Z(){
        // super(); // 默认存在的，会调用父类的无参构造器
        super("张三", 20);
        System.out.println("子类Z的无参构造器执行了");
    }

    public Z(String name){
        // super(); // 默认存在的，会调用父类的无参构造器
        super("李四", 22);
        System.out.println("子类Z的有参构造器执行了");
    }
}

public class Test {
    public static void main(String[] args) {
        // 先认识子类构造器的特点，再掌握这个特点的常见应用场景
        Z z = new Z(); // 会去调用父类的无参构造器，再执行自己的构造器
        Z z1 = new Z("张三"); // 会去调用父类的无参构造器，再执行自己的有参构造器
    }
}
